package com.example.base.tools

import android.app.Application
import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import androidx.annotation.RequiresApi
import androidx.core.content.edit

/**
 * 配置工具类
 */
@Suppress("unused", "MemberVisibilityCanBePrivate")
@RequiresApi(Build.VERSION_CODES.GINGERBREAD)
object ConfigTool {

    private lateinit var context: Application
    private lateinit var name: String

    /**
     * 初始化配置工具类
     */
    fun init(context: Application, name: String = "config") {
        ConfigTool.context = context
        ConfigTool.name = name
    }

    /**
     * 获取配置文件对象
     */
    private val sharedPreferences: SharedPreferences by lazy {
        context.getSharedPreferences(name, Context.MODE_PRIVATE)
    }

    /**
     * 储存一个 String 值
     * @param key   键
     * @param value 值, 默认值是空串
     */
    fun putString(key: String, value: String = "") = sharedPreferences.edit {
        putString(key, value)
    }

    /**
     * 取出一个 String 值
     * @param key 键
     * @param defaultValue 默认值, 默认为空串
     */
    fun getString(key: String, defaultValue: String = ""): String =
        sharedPreferences.getString(key, defaultValue)!!

    /**
     * 储存一个 int 值
     * @param key   键
     * @param value 值, 默认值是 0
     */
    fun putInt(key: String, value: Int = 0) = sharedPreferences.edit {
        putInt(key, value)
    }

    /**
     * 取出一个 int 值, 默认为 0
     * @param key 键
     * @param defaultValue 默认值, 默认为 0
     */
    fun getInt(key: String, defaultValue: Int = 0): Int =
        sharedPreferences.getInt(key, defaultValue)

    /**
     * 储存一个 boolean 值
     * @param key   键
     * @param value 值, 默认值为 true
     */
    fun putBoolean(key: String, value: Boolean = true) = sharedPreferences.edit {
        putBoolean(key, value)
    }

    /**
     * 取出一个 boolean 值, 默认为 false
     * @param key 键
     * @param defaultValue 默认值, 默认为 false
     */
    fun getBoolean(key: String, defaultValue: Boolean = false): Boolean =
        sharedPreferences.getBoolean(key, defaultValue)

    /**
     * 储存一个 long 值
     * @param key   键
     * @param value 值, 默认值是 0
     */
    fun putLong(key: String, value: Long = 0) = sharedPreferences.edit {
        putLong(key, value)
    }

    /**
     * 取出一个 long 值, 默认为 0
     * @param key   键
     * @param defaultValue 默认值, 默认为 0
     */
    fun getLong(key: String, defaultValue: Long = 0): Long =
        sharedPreferences.getLong(key, defaultValue)

    /**
     * 储存一个 float 值
     * @param key   键
     * @param value 值, 默认值是 0
     */
    fun putFloat(key: String, value: Float = 0f) = sharedPreferences.edit {
        putFloat(key, value)
    }

    /**
     * 取出一个 float 值, 默认为 0
     * @param key   键
     * @param defaultValue 默认值, 默认为 0
     */
    fun getFloat(key: String, defaultValue: Float = 0f): Float =
        sharedPreferences.getFloat(key, defaultValue)

    /**
     * 移除一个指定 key 的值
     * @param key 键
     */
    fun remove(key: String) = sharedPreferences.edit {
        remove(key)
    }

    /**
     * 移除多个指定 key 的值
     * @param keys 值的组合
     */
    fun remove(vararg keys: String) = keys.forEach { key ->
        remove(key)
    }

    /**
     * 存入一组值
     * @param values 目标存入的一组值
     */
    fun putValues(values: MutableMap<String, Any>) = values.forEach {
        when (it.value) {
            is String -> putString(
                it.key,
                it.value as String
            )
            is Boolean -> putBoolean(
                it.key,
                it.value as Boolean
            )
            is Int -> putInt(it.key, it.value as Int)
            is Long -> putLong(it.key, it.value as Long)
            is Float -> putFloat(it.key, it.value as Float)
        }
    }

    /**  检查配置文件中是否存在目标查找的 key, 若都存在, 则返回 true, 有一个不存在, 则返回 false  **/
    fun isExist(vararg keys: String): Boolean {
        // 检查是否存在目标 keys, 若不存在, 直接返回
        for (key in keys) {
            if (sharedPreferences.contains(key).not())
                return false
        }
        return true
    }

}